OSL in 3ds Max

您所在的位置:网站首页 3ds max材质贴图浏览器什么都没有 OSL in 3ds Max

OSL in 3ds Max

2023-12-22 13:59| 来源: 网络整理| 查看: 265

OSL in 3ds Max 2019

Zap Andersson 2018-03-16

介绍

3ds Max 2019引入了开放着色语言(OSL)。

OSL是一种开源着色语言,理解起来相当简单。在OSL中编写着色器比开发与3ds max C ++映射相同的功能要少几个数量级。简而言之,在编辑器中键入一些OSL代码,就完成了。有关开发人员文档中的更多详细信息。

它以OSL Map的形式对用户可见。它是3ds max中OSL着色器的执行环境,并且实现为可以像任何常规内置3ds max map一样工作。

这意味着它可以在支持常规3ds max着色API(Scanline,vRay,Corona等)的任何渲染器中使用。它还意味着它在渲染器之外工作,在3ds max的任何位置请求常规地图,例如位移修改器等。

但它也适用于本机支持OSL的渲染器,例如Arnold。在这种情况下,不使用OSL Map内的执行环境,而是将OSL源代码,参数值和着色器绑定发送到渲染器,渲染器执行OSL代码本身。越来越多的本地支持OSL的渲染器每天都在出现。

OSL一次使用“即时”编译和优化整个阴影树 - 只要阴影树中的所有着色器都是OSL着色器。您可以混合使用OSL着色器和常规着色器,但优化会受到影响。

3ds max中OSL的一些局限性

OSL Map在第一个版本中有一些限制。仅支持地图,而不支持材质

用OSL编写的着色器可以有多个输出,返回不同的数据类型,如颜色,浮点值,整数,字符串等。这一切都得到了支持。

但是,OSL还支持一种称为“闭包”的特殊类型。人们可以将封闭视为“材料”。当前版本不支持此功能。实际上,这意味着,OSL Map只能用于构建程序纹理(Maps),而不能用于构建材质。

因此,建议的工作流程是在OSL中构建过程纹理贴图,但将输出连接到标准化,定义良好,与渲染器无关的材质,例如3ds max物理材质。

如果您在网上找到的OSL着色器似乎没有做任何事情,或者似乎没有任何输出,那么它可能是OSL“材料”。

仅支持纯数据类型

max中的OSL Map仅支持普通数据类型:颜色,向量,浮点数,整数和字符串。它不支持数组或结构作为输入。

这在实践中很少成为问题,因为很少有OSL着色器实际上使用数组或结构作为输入。请注

意,该限制仅适用于参数-arrays和结构仍然可以在OSL代码中正常工作。开发人员文档中的更多信息。

没有#include语句

OSL代码可以在3ds Max中不包含#include语句。如果您的OSL代码包含......

#include

...不需要并且可以删除,编译器隐式包含文件stdosl.h。关于术语的说明

遗憾的是,计算机图形学术语并不总是精确的,像“着色器”,“地图”这样的词, “纹理”,“程序”和“材料”在不同的环境中,在不同的应用中,甚至在不同的渲染器中使用时,意味着不同的东西。

在OSL中,一切都被称为“着色器”。毕竟,它是一种“阴影”语言。着色器的作用取决于其返回类型;返回闭包的东西将作为3ds max调用的东西

“材料”,以及没有的东西,将充当3ds max称之为“地图”的东西。

由于我们尚不支持闭包(请参阅仅支持地图,而不支持材质),因此它最多将始终显示为“地图”,因此仅存在于“地图”类别下。但是由于这个帮助文本主要讲的是OSL,所以在引用 OSL上下文中的东西时会使用术语“着色器”,即使它的行为类似于“map”到max。

关于多输出地图的说明

原始3ds max渲染API不支持多个输出。 这是稍后介绍的扩展。 因此,大多数3ds max材质和贴图都不了解连接到具有多个输出的贴图。 为了解决这个问题,引入了输出选择器映射,这是一种自动插入具有多个输出的东西之间的中间点,以及不理解多个输出的东西。

在3ds max 2019中,“在地图之间”会自动隐藏,因此在Slate材质编辑器中,它看起来像普通连接(除了导线是蓝色而不是红色)。 通过从Slate中的“选项”菜单中选择“首选项”,然后切换“隐藏单个地图输出选择器”选项,可以打开或关闭该选项:

重要的是要注意,这种隐藏纯粹是装饰性的,仅适用于Slate。 Compact材质仍然会显示输出选择器,MaxScript会看到它,依此类推。

Output Selector VisibleOutput Selector Hidden

OSL地图的用例

OSL Map有两个基本的“用例”。 简而言之,它们看起来像这样:用例#1:正常的“用户”工作流程

您可以在“材质/贴图”浏览器中选择OSL类别,选择一些贴图,将其放在Slate材质编辑器中,然后编辑其参数。 没有什么与任何其他3ds max map插件有任何不同; 它显示在浏览器中,您使用它,在渲染中使用或在支持的渲染器中使用ActiveShade - 完成。

以这种方式填充材质浏览器的所有OSL贴图都来自3ds max插件文件夹。 有关如何自动加载,显示或分类OSL文件的更多详细信息,请参阅添加更多OSL着色器和开发人员文档。

值得注意的是,在此工作流程中,所有着色器代码都托管在插件文件夹下的文件中,并且通常与任何其他插件一样。 如果在适当的文件夹中删除了更新版本,则在渲染时将使用新版本,就像更新任何其他插件一样。 Max附带大约100个OSL着色器,这些都在预安装的OSL着色器的快速浏览一节中介绍。

用例#2:修补工具和着色器开发人员工作流程

OSL地图有另一种风格,一个空的,空的“无人居住”的地图,带有编辑功能。 您可以在常规地图中找到OSL地图。 你放弃它,使用它,但这是令人兴奋的地方:

和以前一样,你将OSL Map拖到了slate中,但实际上并没有做太多的事情(除了一段演示代码)。你可以选择“ 。 。 。 “ 从顶部按钮以从磁盘加载OSL着色器,该磁盘不一定存在于插件文件夹层次结构中,但在任何地方。 OSL Map将动态变换为新参数,产生所需的附加输入和输出,并根据加载的OSL文件开始渲染。

在此工作流程中,OSL代码实际上已加载到OSL映射中。它只在加载时使用该文件,从那时起,代码在OSL Map中作为字符串参数存在。

现在来了一个有趣的部分:点击编辑图标弹出OSL源编辑器。它是一个漂亮,简单,可停靠的语法着色文本编辑器,可以在其中实时编辑OSL代码。通过点击“编译着色器”按钮(当光标位于OSL编辑器文本框中时使用Ctrl-S快捷键),着色器将更新为最新代码所示的内容 - 甚至(使用支持它的渲染器),同时在ActiveShade中进行渲染!

可以使用“保存OSL文件”按钮保存已编辑的文件,但由于代码位于OSL映射内,因此它们也可以存储在最大场景中,甚至可以放在材料库中。不再存在任何文件的外部依赖性,它完全是自包含的。发送到世界各地的渲染场的场景永远不会丢失着色器 - 它们在场景中。

现在,这将OSL Map转变为完整的着色器开发环境。 您可以与代码交互式工作(可以一次弹出多个编辑器)。

完成了漂亮的新着色器后,如果需要,可以将OSL代码保存到磁盘。

也许,当你“完成”时,甚至将它保存在......其中一个插件/ OSL文件夹中...这意味着,下次启动3ds max时,着色器将自动显示在Material / Map浏览器中,并显示其他所有文件夹!

是的,您可以将“裸”OSL映射用作稍后部署为“插件”的着色器的编辑和开发环境,方法是将它们放在Plugins文件夹层次结构下。

工作流程#3 - 没有工作流程

听起来很禅,但我们撒了谎。 实际上没有两个工作流程。 只有两种精神状态。

运行从地图浏览器预加载的着色器的OSL Map,以及在General部分中找到的OSL Map是同一个。 事实上,从OSL部分拖入某些内容只是在一个方面有所不同:默认情况下,OSL Map以“链接”模式进入,并且其文件被预加载到相应的OSL文件中。 而已!

链图标状态表示“链接”模式。

启用此模式后,将从文件按钮上指定的文件中从磁盘读取着色器。

当它关闭时,着色器代码嵌入在OSL Map本身内部。

最好的一点是- 你可以切换。如果你想改变其中一个方面

预装着色器- 你可以! 只需“取消链接”,然后

根据自己的内容进行编辑。 您将只编辑生活在场景中的副本,而不是编辑磁盘上的原始文件。 所有其他仍处于“链接”状态的着色器将保持类似插件的行为。 那些“未链接”的内容将允许在该OSL Map中进行本地编辑。

如果您尝试“重新链接”已修改的地图,它将恢复为文件中的版本,您的编辑将被丢弃。

这使得简单的一次性修改,甚至简单的实验变得非常容易。 修补一些东西,如果你打破它,再次“链接”它,它会回到原来的样子。

添加更多OSL着色器

自动显示在地图浏览器中的OSL着色器是从两种位置加载的:

位于3ds Max根文件夹下的主“系统”OSL文件夹。 这包含3ds Max附带的所有OSL文件 - 不要更改这些文件或将任何新文件放在此文件夹中!

为自定义- >配置系统路径- >第三方插件下列出的每个路径命名OSL的子目录

因此,要添加自己的OSL着色器,有两个选项:

只需将它们放在 \ Plugins \ OSL文件夹中即可

在计算机上创建一个新文件夹,并将该文件夹添加为第三方插件路径。 在它下面创建一个名为OSL的子目录,并将文件放在那里。

在这两种情况下,如果将文件放在OSL目录下的其他子目录中,这将在地图浏览器中显示为类别。

ADN(Autodesk Developers Network)在...运行OSL 

GitHub页面 https://github.com/ADN-DevTech/3dsMax-OSL-Shaders

...您可以在其中找到更多要下载的OSL着色器。

快速浏览预装的OSL着色器关于着色器

使用3ds max 2019运输的OSL着色器属于具有多个子类别的主类别。 子类别主要包含较小的辅助着色器,这些着色器将仅进行简要记录,而主要类别包含略微更复杂的着色器,稍微更详细地记录。

在探索OSL地图时,请记住UI的顶部包含一个小的解释性帮助文本,并且每个参数都可以有一个工具提示,并且该文档仅解释了这些地图

使用3ds max2019发货,但您可以轻松使用第三方,甚至自己编写....

关于“计算默认值”和UVW输入的特别说明 OSL有一个非常特殊的功能,称为“计算默认值”。这意味着地图可以有一个输入,如果它没有连接到任何地方,可以包含一些特殊计算的值作为有用的默认值。您通过输入具有映射输入的事实识别计算的默认值,但UI中没有值的微调器(因为,如果未连接,则使用计算的

值)。

许多地图都使用此功能,例如,所有包含的OSL纹理都带有UVW输入。与经典的最大地图相比,这允许连接任何计算1的输出以驱动纹理的查找位置。

但是,如果地图在未连接UVW输入时执行某些有意义的操作,则使用计算的默认值。大多数 2D纹理使用计算的默认映射到3ds max地图通道1,并且大多数3D纹理具有阴影点对象空间坐标的计算默认值。这样,地图在直接使用时会给出合理的默认纹理。如果想要使用不同的 UVW贴图通道,或以某种方式转换UVW坐标,可以使用UVW类别中的贴图(下面更详细地说明)来实现这一点。

但请注意,使用的计算默认值完全取决于OSL代码本身。一些地图仅仅为了演示目的而做“特殊”事情,例如黑体着色器使用地图通道1的U坐标在表面上制作示例渐变,波长着色器也是如此。这也意味着从网上下载的OSL映射实际上可以为计算的默认值做“任何事情”。

只要注意那些只有Map输入而没有旋转器的东西,并且知道它可能是为了让你在那里提供有意义的输入。

1任何返回三分量值的东西,例如矢量,点,甚至颜色。

General Category

一般类别中的地图有几个不同的用途。 首先,一些较大的,更完整的和立即有用的,例如

Bitmap Lookup,Composite,Rivets或RandomizedBitmap。

但它也包含一些可用作家庭成长的OSL着色器实验(例如Checker或MAHexagon)的基础和示例的地图。

BitmapLookup

此着色器是在OSL中查找位图中像素的通用方法。

与经典的最大位图不同,在这里您可以提供任何计算来提供UV坐标以查找要查找的像素,从而获得最大的自由度。

注意:OSL中的纹理查找是通过OpenImageIO完成的,因此仅支持OpenImageIO支持的图像类型。

注意:避免在OSL树荫下使用非OSL着色器,使用OSL时使用常规最大位图着色器的效率要低于此。

这些是着色器的参数:

BlackBody

计算在给定的开尔文温度范围内由辐射黑体发出的颜色。

这些是着色器的参数:

Candy

计算空间中随机位置的随机球体(在2d表面上看起来像随机圆圈)。 从技术上讲,空间被分成一个网格,每个网格中有一个随机大小和定位的球体。

Checker

棋盘图案,作为最简单可能的有用着色器的编程示例,以及您在着色器编写中自己的实验的良好起点。

请注意,此着色器在技术上是3D,并且实际上不是2d正方形而是3d立方体。 但是当仅馈送2d坐标(这是默认值)时,它将显示为常规检查器着色器。

Composite

一种简单的合成着色器,在两层之间执行“过度”合成操作,即基于alpha(不透明度)通道在顶层上映射顶层。

Digits

模拟7段显示的着色器。 可以用于实际渲染,但实际上对于在Slate中调试事物可能更有用。

Lift/Gamma/Gain

一种简单的颜色着色器,用于改变颜色的亮度/对比度/灰度系数。 请注意,可以在“颜色”类别中找到更复杂的颜色调整图

Mandelbrot

计算最多4维的Mandelbrot / Julia分形。

通过迭代函数计算分形... Z = Z2 + C.......直到达到无穷大。大多数人认为Mandelbrot方程具有二维输入,通过将不同的初始C值作为UV点的复数输入,并将Z初始化为零。

相反,Julia集是通过选择固定的C值并将Z初始化为每个UV点的复数来创建的。

这个着色器结合了这两个,允许你同时初始化C和Z,允许你制作像三维或四维Mandelbrot集或其他奇特的东西。

这些是着色器的参数:

Noise

此着色器与Noise(3D)的工作方式相同,只是它只有一个输出,因此将噪声效果应用于单个值的效率稍高。 有关参数文档,请参阅噪声(3D)。

Noise (3D)

噪声着色器与Noise的工作方式相同,但它可以同时返回三个噪声值,可以单独使用,也可以作为3D矢量(或颜色)。

经典的最大“噪音”可以通过在不同的“八度音阶”上加上多个噪音来增加复杂性,其中每个“八度音阶”的效果在频率上加倍并且在强度上减半,然后对结果应用最小/最大截止。

这种噪声着色器的工作方式略有不同。它仍然总结了所谓的多级噪声

“八度”,但实际上,每次迭代的频率变化量由空隙度定义,强度随增益变化。默认值(分别为2.0和0.5)会产生类似于经典噪音的行为,但您可以完全控制这些设置,并可以将它们设置为任何其他值,以更详细地描绘行为。

此外,经典噪声的最小值/最大值在此处通过“阶跃函数”进行镜像,但最大的区别在于它是每次迭代噪声应用的,而不是最终结果。

OSL噪声有六种不同的类型

perlin –经典的Perlin噪音,返回值在-1到1范围内。

uperlin – 与Perlin相同但无符号,返回0到1范围内的值。

cell –为每个单位立方体空间返回固定值的噪音hash – 为固定输入返回固定随机输出的噪声,但没有连续性,

i.e. 即如果输入稍微改变,则返回完全不同的输出值。

simplex – 单纯噪音

gabor – Gabor噪音。 不是Gabor噪声有一些额外的参数,因此有一个单独的

Noise(Gabor)着色器。

有关各种噪声类型的更多技术细节,请参阅OSL语言规范。

这些是着色器的参数:

Noise (Gabor)

Gabor噪声的特定映射,暴露了它的一些特定参数。

Gabor噪声的计算速度比常规噪声慢,但过滤效果更好,并且有一些额外的参数。 如果不需要额外的东西,也可以使用上述噪声或噪声(3D)地图的“gabor”模式。

它是基于Gabor脉冲函数的带限,滤波,稀疏卷积噪声(参见Lagae等,SIGGRAPH 2012)。 OSL Gabor噪声设计为具有与Perlin噪声有些相似的频率内容和范围。 它比Perlin噪声贵得多,但它的优点是它可以根据输入导数自动正确滤波。

这些是着色器的参数:

RandomizeBitmaps

随机位置,比例,旋转,色移,不透明度,密度等随机化最多十个位图。

从概念上讲,地图首先在每个单位的纹理空间中放置一个位图副本,然后对其应用一组随机操作,使结果看起来是随机的。在默认值中,只有位置是随机的。即使将其转为零,结果实际上也是一个完全规则的网格。但是地图允许完全控制如何随机化每个位图实例的每个方面,使 得“起始点”是无法检测的常规网格。

但是,为了使其正常工作,着色器必须查看要放置在UV空间的当前阴影单位平方中的位图,以及它周围的每个相邻单位正方形,以防来自该正方形的位图已被放置由于位置或比例变换而被推入该广场。因此,Overlap参数存在。默认值1使每次查找实际上检查每个方向上的每个最近的单位正方形,总共检查3 x 3网格(9个正方形),中间有“当前”正方形。有时,如果使用非常大的位置偏移或非常大的刻度,这可能是不够的,导致位图的截止边缘出现远远移动或放大很多。这可以通过将Overlap参数增加到2来解决,但请记住,这需要在每个方向上查找邻居2个步骤,从而查找5x5网格(25个方格)。对于值3,查找7x7网格(49个方格)等。

显然,这会降低Overlap参数值中每一步的性能。增加这个时要小心!

关于概率参数的特别说明,它有三个值。 第一个是简单的整体概率,它将导致位图的实例出现或不出现。 然而,自然界中的随机性倾向于具有“聚集”行为,因此第二值是在概率上应用大规模噪声函数的“聚集概率”。 第三个值是所述噪声的标度(在UVW空间中)。

这些是着色器的参数:

Rivets

也被称为“Steam-Punk着色器”。 在UV空间中(在应用Scale参数之后)在每个单位正方形周围添加一组铆钉和边缘,并应用一组随机化以获得更“苦恼”的外观。 这个着色器可能是可笑的特定于域的,但请将其视为使用OSL着色器可能无数个事物之一的示例...

注意:上图还使用UVW行偏移图来给出偏移外观。 

这些是着色器的参数:

UberBitmap

UberBitmap是一体化的位图着色器。

通用的“位图查找”默认为映射通道1.要使用其他映射,必须将UVW通道映射连接到其输入。如果想要以任何复杂的方式调整坐标,可能还需要使用UVW变换图。 这几乎每次都让你最终得到这个:

由于这种基于应用了某些变换的地图通道查找位图的用例非常常见,因此UberBitmap的存在将UVW通道,UVW变换和位图查找链组合到一个着色器中。 它与经典的最大Bitmap着色器最相似。

这些是着色器的参数,它是三个地图组合的超集:

WaveLength

Computes an RGB color for a given wavelength

Subcategories

子类别中的着色器是更简单的着色器,不会在每个参数级别上记录。 从理论上讲,它们应该是不言自明的,或者有足够的工具提示使其使用不言自明。

Math/Color

包含与颜色和颜色处理相关的数学运算和辅助函数。

Math/Float

包含与浮点数相关的数学运算和辅助函数。 注意:所有三角函数都以弧度为单位工作。

Math/Vector

包含与向量,点或法线相关的数学运算和辅助函数(所有三个都被视为“向量”类型)

Scene

用于获取有关场景的数据的地图

About Named Attributes

命名属性着色器可以返回当前OSL执行环境公开的任何命名属性。 但是,了解哪个执行环境很重要。 例如,当渲染3ds max的Scanline渲染器或支持经典着色器界面的任何其他渲染器内部时,它是在使用的执行环境中内置的3ds max,而在例如渲染时Arnold渲染器,它是正在使用的Arnold执行环境。

这使得属性列表可用于渲染器相关。 有一个推荐列表,但不能绝对保证max中的每个渲染器实现都遵循推荐列表。 也许不会。

因此,最好使用特殊映射来获取场景值,例如“nodeHandle”映射。 实际上,它只是获得一个名为“ nodeHandle”的特殊命名属性,但使用特定Map而不是一般“命名属性”映射的优点是,

原则上可以更新“nodeHandle”映射,以防某个新渲染器的行为不同并以不同的方式命名其属性,而使用“命名属性”映射并在Attribute参数中键入“nodeHandle”可能会起作用... 但可能不会。

User Defined Attributes

在具有兼容OSL执行环境的渲染器中,命名属性还可以返回用户定义属性。 这些是在“用户定义”选项卡上的“对象属性”对话框中键入的值。 只需输入一个名称/值对,例如“ Foo = 13.0”,就会向OSL公开一个名为“ usr_Foo”的对象的属性,其浮点值为13.0。

为了使这更容易使用,可以在Attribute参数中简单地键入“Foo”并选中User Defined Property复选框,该复选框在引擎盖下添加“usr_”前缀。 支持integer,string,float或三个逗号分隔的浮点数(对于颜色或向量)的值。

数据的类型由值的格式定义,

Switchers

由于各种标准(如索引号,条件等)而在/选择其他地图之间切换的地图。

UVW

用于处理纹理贴图坐标的地图

Values

传递或公开普通值的映射,用于将共享值连接到其他映射,以便给定值只需在一个位置输入,但可以连接到多个位置。

以上:翻译还是很辛苦的(虽然是谷歌翻译但是不影响观看)对学习自带的osl帮助很大。

                                       如果投币收藏多的话,我会放出pdf版本。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3